#include "hook.hpp"

namespace libco {

static thread_local bool t_hook_enable = false;

void set_hook_enable() {
    t_hook_enable = true;
}

} // namespace libco

extern "C" {

sleep_func_t sleep_f = (sleep_func_t)dlsym(RTLD_NEXT, "sleep");
unsigned int sleep(unsigned int seconds) {
    if (!libco::t_hook_enable) {
        return sleep_f(seconds);
    }
    auto cur = libco::Coroutine::GetThis();
    auto monitor = libco::Monitor::GetThis();

    monitor->addTimer(seconds * 1000, [cur]() {
        libco::Monitor::schedule(cur);
    });
    cur->yield();
    return 0;
}

usleep_func_t usleep_f = (usleep_func_t)dlsym(RTLD_NEXT, "usleep");
nanosleep_func_t nanosleep_f = (nanosleep_func_t)dlsym(RTLD_NEXT, "nanosleep");

} // extern "C"